package com.xueyi.workflow.domain.dto;

import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.util.List;
import java.util.Map;

/**
 * 提交审核请求对象
 *
 * @author xueyi
 * @date 2024-12-19
 */
@Data
public class SubmitApprovalRequest {

    /**
     * 任务ID
     */
    @NotBlank(message = "任务ID不能为空")
    private String taskId;

    /**
     * 流程实例ID
     */
    @NotBlank(message = "流程实例ID不能为空")
    private String processInstanceId;

    /**
     * 审批结果：PASS/REJECT/TRANSFER
     */
    @NotBlank(message = "审批结果不能为空")
    private String approvalResult;

    /**
     * 审批意见
     */
    private String approvalOpinion;

    /**
     * 下一节点配置（可选，如果不传则从流程版本中获取）
     */
    private List<NextNodeConfig> nextNodes;

    /**
     * 人员配置（可选，如果不传则从流程版本中获取）
     */
    private List<Map<String, Object>> assigneeConfig;

    /**
     * 表单数据（可选，用于网关条件判断）
     */
    private Map<String, Object> formData;

    /**
     * 抄送用户ID列表（逗号分隔，可选）
     */
    private String ccUsers;

    /**
     * 通知方式（逗号分隔，可选）：system,email,sms,wechat
     */
    private String notificationMethods;

    /**
     * 转办人员ID（转办时使用，可选）
     */
    private String transferAssignee;

    /**
     * 下一节点配置
     */
    @Data
    public static class NextNodeConfig {
        /**
         * 节点ID
         */
        private String nodeId;

        /**
         * 节点名称
         */
        private String nodeName;

        /**
         * 节点类型
         */
        private String nodeType;

        /**
         * 处理人员列表
         */
        private List<HandlerInfo> handlers;
        
        /**
         * 抄送人员列表
         */
        private List<HandlerInfo> ccUsers;
        
        /**
         * 通知方式（逗号分隔）：system,email,sms,wechat
         */
        private String notificationMethods;
    }

    /**
     * 处理人员信息
     */
    @Data
    public static class HandlerInfo {
        /**
         * 处理人员ID
         */
        private String id;

        /**
         * 处理人员名称
         */
        private String name;

        /**
         * 处理人员类型：user/dept/role/post
         */
        private String type;

        /**
         * 处理人员账号
         */
        private String account;
    }
} 